﻿/**
 * key类
 * 作者：张峰
 * 日期：2009.04.17
 * 版本：AS3.0  0.1.0.0
 * 功能：组合按键，顺序按键。
 */
package zf.ui
{
	import flash.display.Stage;
	import flash.events.EventDispatcher;
	import flash.events.KeyboardEvent;
	import flash.utils.getTimer;

	/**
	 * 按键类。实现组合按键，顺序按键。 
	 * @author mike.zhang
	 * @langversion 3.0 
	 * @playerversion Flash 9 
	 * 
	 */
	public class Key extends EventDispatcher
	{
		private var tstage:Stage;
		private var keyObject:Object=new Object  ;
		private var keyTimeObject:Object=new Object  ;

		/**
		 * 连续按键检测间隔最大时间，单位毫秒；
		 */
		public var timeMaxInterval:uint=500;
		/**
		 * 连续按键检测间隔最小时间，单位毫秒；
		 */
		public var timeMinInterval:uint=50;
		/**
		 * 创建按键 ，必须传递Stage，否则不能建立侦听
		 * @param s Stage类型
		 * 
		 */
		public function Key (s:Stage)
		{
			if (s.hasEventListener(KeyboardEvent.KEY_UP) || s.hasEventListener(KeyboardEvent.KEY_DOWN))
			{
				trace ("注意已经有一个侦听按键了");
			}
			tstage=s;
			tstage.addEventListener (KeyboardEvent.KEY_UP,keyUpEvent);
			tstage.addEventListener (KeyboardEvent.KEY_DOWN,keyDownEvent);
		}

		/**
		 * 组合按键 
		 * @param rest 一个或多个按键键值
		 * @return 全部按下返回true
		 * 
		 */
		public function isDown (... rest):Boolean
		{
			for each (var i:uint in rest)
			{
				if (! keyObject[i])
				{
					return false;
				}
			}
			return true;
		}
		/**
		 * 顺序按键
		 * @param rest 依次按下的按键键值
		 * @return 顺序按下后返回true
		 * 
		 */
		public function isOrderDown (... rest):Boolean
		{
			var l:uint=rest.length;
			if (! keyTimeObject[rest[l - 1]])
			{
				return false;
			}
			for(var i:uint=l-1;i>1;i--)
			{
				if (! keyTimeObject[rest[i - 1]] || (keyTimeObject[rest[i]] - keyTimeObject[rest[i - 1]] > timeMaxInterval && keyTimeObject[rest[i]] - keyTimeObject[rest[i - 1]] < timeMinInterval))
				{
					return false;
				}
			}
			return true;
		}
		private function keyUpEvent (e:KeyboardEvent):void
		{
			keyObject[e.keyCode]=false;
			dispatchEvent (e);
		}
		private function keyDownEvent (e:KeyboardEvent):void
		{
			keyObject[e.keyCode]=true;
			keyTimeObject[e.keyCode]=getTimer() + 1;
			dispatchEvent (e);
		}
	}
}